package com.wxzhou.wangzhuan.security;

import com.wxzhou.wangzhuan.dto.UserInfoDto;
import io.quarkus.security.identity.SecurityIdentity;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;

import java.util.Optional;

/**
 * 用户上下文工具类
 * 用于安全地获取当前用户信息，支持可选认证
 */
@ApplicationScoped
public class UserContext {

    @Inject
    SecurityIdentity securityIdentity;

    /**
     * 获取当前用户ID（安全方式）
     * @return 用户ID的Optional包装，如果未认证则返回空
     */
    public Optional<String> getCurrentUserId() {
        try {
            if (securityIdentity != null && securityIdentity.getPrincipal() != null) {
                return Optional.of(securityIdentity.getPrincipal().getName());
            }
        } catch (Exception e) {
            // 忽略任何异常，返回空Optional
        }
        return Optional.empty();
    }

    /**
     * 获取当前用户信息（安全方式）
     * @return 用户信息的Optional包装，如果未认证则返回空
     */
    public Optional<UserInfoDto> getCurrentUserInfo() {
        try {
            if (securityIdentity != null && securityIdentity.getPrincipal() != null) {
                CustomPrincipal principal = (CustomPrincipal) securityIdentity.getPrincipal();
                UserInfoDto userInfo = new UserInfoDto();
                userInfo.setUserId(principal.getUserId());
                userInfo.setChannel(principal.getChannel());
                userInfo.setDeviceId(principal.getDeviceId());
                userInfo.setUserLevel(principal.getUserLevel());
                // 可以从SecurityIdentity的attributes中获取更多信息
                if (securityIdentity.getAttribute("nickname") != null) {
                    userInfo.setNickName(securityIdentity.getAttribute("nickname"));
                }
                return Optional.of(userInfo);
            }
        } catch (Exception e) {
            // 忽略任何异常，返回空Optional
        }
        return Optional.empty();
    }

    /**
     * 检查用户是否已认证
     * @return true如果用户已认证，false否则
     */
    public boolean isAuthenticated() {
        try {
            return securityIdentity != null && securityIdentity.getPrincipal() != null && getCurrentUserIdOrNull() != null && !getCurrentUserIdOrNull().isBlank();
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 获取当前用户ID（直接方式，可能抛出异常）
     * @return 用户ID，如果未认证则返回null
     */
    public String getCurrentUserIdOrNull() {
        try {
            if (securityIdentity != null && securityIdentity.getPrincipal() != null) {
                return securityIdentity.getPrincipal().getName();
            }
        } catch (Exception e) {
            // 忽略异常，返回null
        }
        return null;
    }

    /**
     * 获取CustomPrincipal（直接方式）
     * @return CustomPrincipal，如果未认证则返回null
     */
    public CustomPrincipal getCustomPrincipal() {
        try {
            if (securityIdentity != null && securityIdentity.getPrincipal() != null) {
                return (CustomPrincipal) securityIdentity.getPrincipal();
            }
        } catch (Exception e) {
            // 忽略异常，返回null
        }
        return null;
    }
} 